package com.seeyon.apps.kk.manager;

import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang.time.DateFormatUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.alibaba.fastjson.JSON;
import com.seeyon.apps.kk.manager.datasync.AbstractDataSyncManager;
import com.seeyon.ctp.common.AppContext;
import com.seeyon.v3x.services.form.FormFactory;
import com.seeyon.v3x.services.form.FormUtils;
import com.seeyon.v3x.services.form.bean.FormExport;

/**
 * 推送数据写入日志表
 * 
 * @author seeyon
 *
 */
public class DataPushLogManageImpl extends AbstractDataSyncManager {

	private static Logger log = LoggerFactory.getLogger(DataPushLogManageImpl.class);

	private FreemarkFlowManager freemarkFlowManager;

	private TemplateTongManagerImpl tongManagerImpl = null;

	private CeLiangSheBeiManagerImpl ceLiangSheBeiManagerImpl = (CeLiangSheBeiManagerImpl) AppContext
			.getBean("ceLiangSheBeiManagerImpl");

	public FreemarkFlowManager getFreemarkFlowManager() {
		return freemarkFlowManager;
	}

	public void setFreemarkFlowManager(FreemarkFlowManager freemarkFlowManager) {
		this.freemarkFlowManager = freemarkFlowManager;
	}

	/**
	 * 日志写入
	 * 
	 * @param parmas
	 * @param json
	 */
	public void sendLog(Map<String, Object> parmas, String json) {
		parmas.put("json", json);
		try {
			String dataXml = this.freemarkFlowManager.fltTemplateIntoString("datasync/log/addTOLogXML.ftl", parmas);
			// 可以使用数据模板生成，这样底表事件依然有效
			FormFactory formFactory = (FormFactory) AppContext.getBean("formFactory");
			FormExport[] formExports = FormUtils.xmlTransformFormExports(dataXml);
			for (FormExport formExport : formExports) {
				formFactory.importBusinessFormData("oa2", "SH_LOG_0001", formExport, null);
			}
		} catch (Exception e) {
			log.info("=========shkk log send error:{}", e.getMessage());
		}
	}

	/**
	 * 更新日志数据抛送状态
	 * 
	 * @param parmas
	 * @param result
	 */
	public void updateLog(Map<String, Object> parmas, String result) {
		Map<String, Object> resultMap = JSON.parseObject(result);
		Map<String, Object> rsMap =JSON.parseObject(MapUtils.getString(resultMap, "return"));
		log.info("请求结果：{}", MapUtils.getString(rsMap, "state"));
		String countSql = "SELECT FIELD0010 FROM FORMMAIN_2995 WHERE FIELD0003 = '" + MapUtils.getString(parmas, "id")
				+ "'";
		List<Map<String, Object>> list = this.jdbcTemplate.queryForList(countSql);
		int count = 1;
		if (!list.isEmpty())
			count = MapUtils.getInteger(list.get(0), "FIELD0010") == null ? 1
					: MapUtils.getInteger(list.get(0), "FIELD0010") + 1;
		if (MapUtils.getInteger(rsMap, "state") == 1) {
			// TOTDO 获取field0010
			String sql = "UPDATE FORMMAIN_2995 SET FIELD0007 = 'Y',FIELD0009 = TO_CHAR(SYSDATE,'yyyy-MM-dd HH:mm:ss'),FIELD0010 = '"
					+ count + "' WHERE FIELD0003 = '" + MapUtils.getString(parmas, "id") + "'";
			int rs = this.jdbcTemplate.update(sql);
			log.info("============shkk rethrow result is ok:{}", rs);
		} else {
			String sql = "UPDATE FORMMAIN_2995 SET FIELD0010 = '" + count + "' WHERE FIELD0003 = '"
					+ MapUtils.getString(parmas, "id") + "'";
			int rs = this.jdbcTemplate.update(sql);
			log.info("=============shkk rethrow result is error:{}", rs);
		}
	}

	/**
	 * 重新抛送数据
	 */
	public void rethrow() {
		String sql = "SELECT FIELD0006,FIELD0004,'no' isAdd FROM FORMMAIN_2995 WHERE FIELD0007 = 'Y' AND TO_CHAR(TO_DATE(FIELD0009,'yyyy-mm-dd hh24:mi:ss'),'yyyy-MM') = TO_CHAR(SYSDATE,'yyyy-MM')";
		List<Map<String, Object>> list = this.jdbcTemplate.queryForList(sql);
		for (Map<String, Object> map : list) {
			String templateCode = MapUtils.getString(map, "FIELD0004");

			if (StringUtils.equals(templateCode, "SH_ARCHIVES_0001")) {
				// 档案资料利用审批 重新抛送数据
				log.info("=============shkk 档案资料利用审批 数据重新抛送开始=================");
				init().sendTODOCArchives(map);
				log.info("=============shkk 档案资料利用审批 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_CLSB_0001")) {
				// 测量设备周期管理申请表 重新抛送数据
				log.info("=============shkk 测量设备周期管理申请表 数据重新抛送开始=================");
				ceLiangSheBeiManagerImpl.sendTONCInspectionCycle(map);
				log.info("=============shkk 测量设备周期管理申请表 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_CLSB_0002")) {
				// 测量设备退出周检申请表 重新抛送数据
				log.info("=============shkk 测量设备退出周检申请表 数据重新抛送开始=================");
				ceLiangSheBeiManagerImpl.sendTONCInspectionStatus(map);
				log.info("=============shkk 测量设备退出周检申请表 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_CLSB_0003")) {
				// 测量设备周期管理调整申请单 重新抛送数据
				log.info("=============shkk 测量设备周期管理调整申请单 数据重新抛送开始=================");
				ceLiangSheBeiManagerImpl.sendTONCAdjustCycle(map);
				log.info("=============shkk 测量设备周期管理调整申请单 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_SGCORD_0001")) {
				// 上岗证 重新抛送数据
				log.info("=============shkk 上岗证 数据重新抛送开始=================");
				init().sendTONCEmployeeCard(map);
				log.info("=============shkk 上岗证 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_SHOUHOU_WCXX_001")) {
				// 外场信息通知单 重新抛送数据
				log.info("=============shkk 外场信息通知单 数据重新抛送开始=================");
				init().sendTONCWorkOrder(map);
				log.info("=============shkk 外场信息通知单 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_ZYJS_ZWPR_001")) {
				// 专业技术职务聘任审批表 重新抛送数据
				log.info("=============shkk 专业技术职务聘任审批表 数据重新抛送开始=================");
				init().sendTONCBatchInsertTechVO(map);
				log.info("=============shkk 专业技术职务聘任审批表 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_ZYJN_DJJS_001")) {
				// 职业技能等级晋升审批表 重新抛送数据
				log.info("=============shkk 职业技能等级晋升审批表 数据重新抛送开始=================");
				init().sendTONCBatchInsertSkillVO(map);
				log.info("=============shkk 职业技能等级晋升审批表 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_STAFF_001")) {
				// 新职工考核评价表 重新抛送数据
				log.info("=============shkk 新职工考核评价表 数据重新抛送开始=================");
				init().sendTONCBatchInsertNewEmployeeVO(map);
				log.info("=============shkk 新职工考核评价表 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_STAFF_002")) {
				// 职工能力考评（专业技术类） 重新抛送数据
				log.info("=============shkk 职工能力考评（专业技术类） 数据重新抛送开始=================");
				map.put("type", "y");
				init().sendTONCBatchInsertAbilityVO(map);
				log.info("=============shkk 职工能力考评（专业技术类） 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_STAFF_003")) {
				// 职工能力考评（操作和辅助类） 重新抛送数据
				log.info("=============shkk 职工能力考评（操作和辅助类） 数据重新抛送开始=================");
				map.put("type", "n");
				init().sendTONCBatchInsertAbilityVO(map);
				log.info("=============shkk 职工能力考评（操作和辅助类） 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_LDHT_0001")) {
				// 劳动合同续签 重新抛送数据
				log.info("=============shkk 劳动合同续签 数据重新抛送开始=================");
				init().sendTONCContractRenewal(map);
				log.info("=============shkk 劳动合同续签 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_STAFF_004")) {
				// 职工年度考核登记表 重新抛送数据
				log.info("=============shkk 职工年度考核登记表 数据重新抛送开始=================");
				init().sendTONCBatchInsertAnnualAssessVO(map);
				log.info("=============shkk 职工年度考核登记表 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_SUPPLIE_002")) {
				// 合格供应商调整表 重新抛送数据
				log.info("=============shkk 合格供应商调整表 数据重新抛送开始=================");
				map.put("type", "y");
				init().sendTONCSupplierStatus(map);
				log.info("=============shkk 合格供应商调整表 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_SUPPLIE_003")) {
				// 供应商绩效评价表 重新抛送数据
				log.info("=============shkk 供应商绩效评价表 数据重新抛送开始=================");
				map.put("type", "n");
				init().sendTONCSupplierStatus(map);
				log.info("=============shkk 供应商绩效评价表 数据重新抛送完成=================");
			}
			if (StringUtils.equals(templateCode, "SH_HT_FK_0001")) {
				// 合同付款申请单 重新抛送数据
				log.info("=============shkk 合同付款申请单 数据重新抛送开始=================");
				init().sendTONCApply(map);
				log.info("=============shkk 合同付款申请单 数据重新抛送完成=================");
			}

		}

	}

	private TemplateTongManagerImpl init() {
		if (null == tongManagerImpl) {
			tongManagerImpl = (TemplateTongManagerImpl) AppContext.getBean("templateTongManagerImpl");
		}
		return tongManagerImpl;
	}

	@Override
	public boolean beforeGrabData() {
		// TODO Auto-generated method stub
		log.info("===============shkk 重新抛送，抛送失败的数据 开始：{}", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
		this.rethrow();
		log.info("===============shkk 重新抛送，抛送失败的数据 结束：{}", DateFormatUtils.format(new Date(), "yyyy-MM-dd HH:mm:ss"));
		return false;
	}

	@Override
	public boolean grabData() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean addData() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean updateData() {
		// TODO Auto-generated method stub
		return false;
	}

	@Override
	public boolean deleteData() {
		// TODO Auto-generated method stub
		return false;
	}
}
